package com.sun.tool.annotations;

import com.sun.tool.common.Result;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @auther Sunql
 * @create 2018/3/23
 **/
public class CheckEntityUtil {

    public static List<Result> check(Object obj){
        List<Result> results = new ArrayList<>();
        EntityClass use_annotation; //实体类使用的注解
        int check_value_length = 0; // 校验值 的 长度
        String err_msg ; // 错误提示信息
        String bean_value; //校验对象 属性值
        String attributeName; // 校验对象 属性名称
        List<Field>  list = Arrays.asList(obj.getClass().getDeclaredFields());
        for(int i=0;i<list.size();i++){
            Field field = list.get(i);
            if(field.isAnnotationPresent(EntityClass.class)){//是否使用MyAnno注解
                for (Annotation anno : field.getDeclaredAnnotations()) {//获得所有的注解
                    if(anno.annotationType().equals(EntityClass.class) ){//找到自己的注解
                        err_msg = "";
                        use_annotation = (EntityClass)anno;
                        bean_value = EntityUtil.valueTurnsToString(field.getName(),obj);
                        if(use_annotation.attributeName().equals("")){
                            attributeName = field.getName();
                        }else {
                            attributeName = use_annotation.attributeName();
                        }
                        if(use_annotation.isNotNull()){//注解的值
                            boolean check = EntityUtil.checkValueNotNull(bean_value);
                            if(!check){
                                err_msg += attributeName + "的值不能空,";
                            }
                        }
                        check_value_length = EntityUtil.getValueLength(bean_value);
                        if(use_annotation.maxLen() !=0 && use_annotation.maxLen() < check_value_length ){
                            err_msg += attributeName + "值的长度不能大于" + use_annotation.maxLen() + ",";
                        }

                        if(use_annotation.maxLen() !=0 && use_annotation.minLen() > check_value_length){
                            err_msg += attributeName + "值的长度不能小于" + use_annotation.maxLen() + ",";
                        }

                        if(use_annotation.regularCheck().trim().length() > 0 && !EntityUtil.regularCheck(use_annotation.regularCheck(),bean_value)){
                            err_msg += attributeName + "的值不符合验证规则,";
                        }

                        if(use_annotation.isNumber() && !EntityUtil.checkNumber(bean_value)){
                            err_msg += attributeName + "的值必须为数字,";
                        }

                        if(err_msg.length() > 0){
                            err_msg = err_msg.substring(0,err_msg.length()-1);
                            // err_msg = obj.getClass() + " " + err_msg;
                            if(!use_annotation.message().equals("")){
                                err_msg = use_annotation.message();
                            }
                            results.add(Result.getResult(1,err_msg));
                        }
                    }
                }
            }

        }
        return  results;
    }
}
